package com.zack.util.nlp.tfidf;

import java.util.List;
import java.util.Map;

import com.zack.util.collections.MapProcessing;
import com.zack.util.multitype.file.ReadAndWriteFileFromDirectory;
/**
* author: dejian
* 2017  Sep 28, 2017  1:40:49 PM  (could be changed)
**/
public class PrintTFIDFUtil {
    
    
    
 public static void main(String[] args) {
        
        String wrtToFile = "data/tfidf/result/tf.result";
        
//        第一种： 所有doc的分词结果都在一个文件里，并且doc之间有"\u2003\u2002\u2001"分割
        String corpusFile = "data/tfidf/corpus.txt";
        printTFFromFileIntoFile(corpusFile,wrtToFile);
        
      //第二种： 所有doc的分词结果都在单独文件中并且在一个文件夹里
//        String corpusDir = "data/tfidf/tfidf-corpus/";
//        printTFFromDirIntoFile(corpusDir,wrtToFile);
        
        
    }
    
    /**
     * 把一个corpus的tf输出到文件
     * 所有文档内容在一个corpus里面
     * 注意文档里， 分词与分词之间使用空格隔开， ， 文档与文档之间使用 DOC_SPLIT_MARK = "\u2003\u2002\u2001";隔开
     * 女    16  0.016              每一行的输出类似这种， term,词频，词频/总词
     * 
     * @param corpusPath
     */
    public static void printTFFromFileIntoFile(String corpusPath,String wrtToFile) {
        StringBuilder strb = new StringBuilder();
        TFAllFromFile.tfAllFromCorpusFile(corpusPath);
        Map<String, Integer> corpusTermFreqMap = MapProcessing.sortMapByMapValue(TFAllFromFile.corpusTermFreqMap, false);
        for(Map.Entry<String, Integer> entry : corpusTermFreqMap.entrySet()) {
            strb.append(entry.getKey()+"\t"+entry.getValue()+"\t"+(entry.getValue()*1.0/(TFAllFromFile.allWordNum*1.0))+"\n");
        }
        ReadAndWriteFileFromDirectory.writeStringToFileWithFileName(strb.toString(), wrtToFile);
        System.out.println("Finish writing tf into file.");
    }
    
    /**
     * 把一个corpus的tf输出到文件
     * 所有文档内容在独立文件中并且都在一个文件夹里，允许递归
     * 注意文档里， 分词与分词之间使用空格隔开， ， 文档与文档之间使用 DOC_SPLIT_MARK = "\u2003\u2002\u2001";隔开
     * 女    16  0.016              每一行的输出类似这种， term,词频，词频/总词
     * @param corpusPath
     */
    public static void printTFFromDirIntoFile(String dirPath,String wrtToFile) {
        StringBuilder strb = new StringBuilder();
        TFAllFromFile.tfAllFromDir(dirPath);
        Map<String, Integer> corpusTermFreqMap = MapProcessing.sortMapByMapValue(TFAllFromFile.corpusTermFreqMap, false);
        for(Map.Entry<String, Integer> entry : corpusTermFreqMap.entrySet()) {
            strb.append(entry.getKey()+"\t"+entry.getValue()+"\t"+(entry.getValue()*1.0/(TFAllFromFile.allWordNum*1.0))+"\n");
        }
        ReadAndWriteFileFromDirectory.writeStringToFileWithFileName(strb.toString(), wrtToFile);
        System.out.println("Finish writing tf into file.");
    }
    
    /**
     * 所有文档内容在一个corpus里面
     * 统计每一篇文章的tf 每一篇都进行输出
     */
    public static void printTfAccodEachDoc(String corpusPath,String wrtToFile) {
        StringBuilder strb = new StringBuilder();
        TFAllFromFile.tfAllFromDir(corpusPath);
        Map<String, Map<String, Integer>> corpusTermFreqMap = MapProcessing.sortMapByMapValue(TFAllFromFile.docTermFreqMap, false);
        for(Map.Entry<String, Map<String,Integer>> entry : corpusTermFreqMap.entrySet()) {
            strb.append(entry.getKey()+"\n");
            for(Map.Entry<String, Integer> termFreq:entry.getValue().entrySet()) {
                strb.append(termFreq.getKey()+"\t"+termFreq.getValue()+"\t"+(termFreq.getValue()*1.0/(TFAllFromFile.docNameTermNumMap.get(termFreq.getKey())*1.0))+"\n");
            }
        }
        ReadAndWriteFileFromDirectory.writeStringToFileWithFileName(strb.toString(), wrtToFile);
        System.out.println("Finish writing tf into file.");
    }
    
    public static void printTFIDFBeansIntoFile(Map<String, List<TFIDFBean>> docTFIDFBeans, String toFilePath) {
        StringBuilder strB = new StringBuilder();
        for(Map.Entry<String, List<TFIDFBean>> allBeans : docTFIDFBeans.entrySet()) {
           for(TFIDFBean tfidfBean: allBeans.getValue()) {
               strB.append(tfidfBean.getDocName()+"\t\t"+tfidfBean.getTerm()+"\t"+tfidfBean.getTermFreqInDoc()+"\t"
                       + ""+tfidfBean.getTermFreqInCorpus()+"\t"+tfidfBean.getTf()+"\t"+tfidfBean.getTfidf()+"\n");
           }
        }
        ReadAndWriteFileFromDirectory.writeStringToFileWithFileName(strB.toString(), toFilePath);
    }
    
    
}
